#include <iostream>
#include <vector>
#include <signal.h>
#include <unistd.h>

#define MAX_SIGNUM 31
using namespace std;

static vector<int> sigarr = {2};

void print(const sigset_t& pending)
{
    for(int signo = MAX_SIGNUM; signo >= 1; --signo)
    {
        if(sigismember(&pending, signo))
            cout << "1";
        else
            cout << "0";
    }
    cout << endl;
}

void myhandler(int signo)
{
    cout << signo << "号信号已经递达！" << endl;
}

int main()
{
    for(const auto& sig : sigarr)
    {
        signal(sig, myhandler);
    }
    //1. 屏蔽指定的信号
    sigset_t block, oblock, pending;
    //1.1 初始化
    sigemptyset(&block);
    sigemptyset(&oblock);
    sigemptyset(&pending);
    //1.2 添加要屏蔽的信号
    for(const auto& sig : sigarr)
    {
        sigaddset(&block, sig);
    }
    //1.3 开始屏蔽 : 在这里才对PCB进行设置
    sigprocmask(SIG_SETMASK, &block, &oblock);


    int cnt = 5;
    //2. 打印pending信号集
    while(true)
    {
        sigemptyset(&pending);
        //获取pending信号集
        sigpending(&pending);
        //打印
        print(pending);
        sleep(1);
        if(cnt-- == 0)
        {
            // cout << "解除对信号的屏蔽，不屏蔽任何信号" << endl;
            //一旦对特定信号进行解除屏蔽，一般OS至少立马递达一个信号
            sigprocmask(SIG_SETMASK, &oblock, &block); 
            cout << "解除对信号的屏蔽，不屏蔽任何信号" << endl;
        }
    }



    return 0;
}